<?php

namespace app\api\controller\ai;

use app\common\model\ai\Models;
use thinkct\controller\Frontend;
use thinkct\facade\ChatAI;
use orhanerday\OpenAi;
use app\admin\model\ai\Config as ConfigModel;

class Tool extends Frontend
{

    protected array $noNeedLogin = [];
    //protected array $noNeedLogin = ['*'];

    public function initialize(): void
    {
        parent::initialize();
    }

    public function mind(): void
    {
        $text = $this->request->post('text');
        if (empty($text)) {
            $this->error('内容不能为空');
        }
        $model = Models::where(['default' => 1, 'status' => 1])->find();
        if (!$model) {
            $this->error('未找到默认模型');
        }
        $model_key = ChatAI::getModelKey($model->id);
        if (!$model_key) {
            $this->error('未找到模型key');
        }
        $model->key = $model_key->key;
        $model->api_url = $model_key->api_url;
        ChatAI::sendText($text, '你现在是一个markdown语法专家，我需要用markmap制作思维导图，你需要把我提的要求转换成markdown的形式输出，请包括至少5个分支主题。同时，请为每个分支主题添加至少两个子主题，并在需要的情况下，为子主题添加更多层次的子主题，内容需要尽可能详细。在此过程中不要输出任何无关markdown语法的内容。之后的对话都按此要求进行。', $model);
    }

    // 图片转代码
    public function imageToCode()
    {
        $image_code_key = ConfigModel::where('name', 'image_code_key')->value('value');
        $image_code_api_url = ConfigModel::where('name', 'image_code_api_url')->value('value');
        $img_url = $this->request->post('img_url', 'https://www.surely.cool/surely-vue-logo.png');

        if (empty($image_code_key) || empty($image_code_api_url)) {
            $this->error('未配置图片转代码的key和api_url');
        }

        if (empty($img_url)) {
            $this->error('图片地址不能为空');
        }

        $open_ai = new OpenAi($image_code_key);
        $open_ai->setBaseURL($image_code_api_url);

        $chat = $open_ai->chat([
            'model' => 'gpt-4-vision-preview',
            'messages' => [
                [
                    'role' => 'user',
                    'content' => [
                        [
                            'type' => 'text',
                            'text' => '你现在是一个前端工程师，你需要把我提的图片内容转换成前端代码形式输出。专业前端代码。在此过程中不要输出任何不是代码的内容。'
                        ],
                        [
                            'type' => 'image_url',
                            'image_url' => [
                                'url' => $img_url
                            ]
                        ]
                    ]
                ]
            ],
            'max_tokens' => 20000,
            'stream' => true,
        ], function ($curl, $data) {

            echo $data;

            //设置响应头，确保浏览器正确解析返回的数据流
            if (!headers_sent() && !in_array('content-type', array_map('strtolower', headers_list()))) {
                header('Content-Type: text/event-stream');
                header('Connection: keep-alive');
                // 默认
                header('Cache-Control: no-cache');
                header('Access-Control-Allow-Origin: *');
                header('X-Accel-Buffering: no');
            }

            $prefix = 'data:';
            if (str_starts_with($data, $prefix)) {
                $obj = explode('data: ', $data);
                foreach ($obj as $key => $value) {
                    if ($key == 0) {
                        continue;
                    }
                    $value = json_decode($value,true);
                    if (isset($value['choices'][0]['delta']['content'])) {
                        //$this->last .= $value['choices'][0]['delta']['content'];
                    }
                }
            }

            // 判断stream流是否结束
            if (strpos($data, 'DONE')) {
//                $message = Message::where('id', $this->message_id)->find();
//                $message->content = $this->last;
//                $message->save();
            }

            ob_flush();
            flush();
            return strlen($data);
        });
    }
}